/*
-----------------------------------------------------------------------------
This source file is part of DIVA
The project of Engineering Lab, dept. of CSIE, NTNU.

Copyright (c) 2000-2006 The Engineering Lab, dept. of CSIE, NTNU.
-----------------------------------------------------------------------------
Filename:    MyParser.h
Description: 處理math node的parser，與compiler中的parser類似
			 將tokens轉換成類似組合語言
			 EX：1+2 => int temp0 1 2
			 
			 主要是為了判斷整個方程式的結構，不直接輸出結果以增加容錯處理
			 此外某些變數也無法在此處直接取得
-----------------------------------------------------------------------------
*/

#ifndef _MY_PARSER_H_
#define _MY_PARSER_H_

#include <map>
#include <queue>
#include "MyWord.h"

enum PrimaryValue{
	DEFAULT,
	TYPE_ARITH,
	TYPE_LPARENT,
	TYPE_NEGATIVE,
	TYPE_INT,
	TYPE_DOUBLE,
	TYPE_ID
};

class MyParser
{
public:

	~MyParser(void);
	static MyParser* getInstance();

	/** 之後可以改成回傳string，取得處理後的訊息 */
	std::string isSyntax(std::queue<MyWord*>* tokens);

	/** 取得數學方程式的tree的root */
	MyWord* getRoot();
	
private:

	MyParser(void);
	
	//<ARITH>=(expr_list)
	MyWord* arith_list();
	//expr_list=expression{,expression}
	std::vector<MyWord*>* expr_list();
	//expression=factor{add_op factor}
	MyWord* expression();
	//factor=primary{mul_op primary}
	MyWord* factor();
	//primary=	-expression
	//			(expression)
	//			arith(expr_list)
	// 			ID
	//			int
	//			double
	MyWord* primary();	
	//+ and -
	MyWord* add_op();
	//* and / 
	MyWord* mul_op();
	/**吃掉一個匹配的字串，若不符合則syntax_error */
	void match(std::string token);
	/**不符合語法， 目前直接assert */
	void syntax_error(std::string token);
	void syntax_error();

	static MyParser* _myParser;
	std::queue<MyWord*>* _tokens;
	MyWord* _root;
	std::map<std::string,PrimaryValue> primaryType;
	std::string _result;
};
#endif